# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from math import *
import scipy.optimize


import matplotlib
#matplotlib.rcParams['mathtext.fontset'] = 'stix'
#matplotlib.rcParams['font.family'] = 'STIXGeneral'

#%% DONNEES

Ks=1e-32 #produit de solubilité de Al(OH)3

beta4=1e34 #constante de formation du complexe [Al(OH)4]-

Ke=1e-14 #produit ionique de l'eau

#%% FONCTIONS

def s(h):
    #expression de la solubilité
        return Ks*(h/Ke)**3+Ks*beta4*Ke/h

def p(x):
    #expression du cologarithme de la solubilité
        return -np.log10(x)

H = np.linspace(1,1e-14,100) #début, fin, nombre de points
pH = np.linspace(0, 14, 100)

min_s = scipy.optimize.fsolve(s,1e-5) #trouve les racines de la fonction s, ce qui revient à trouver le minimum de solubilité de Al(OH)3. Le deuxième argument correspond à une estimation de sa valeur.


print('Le minimum de solubilité se trouve en pH =')
print(p(min_s))

S=s(10**(-pH)) #On calcule la solubilité en fonction de la concentrations des protons. Ce stratagème est indispensable pour que l'échelle du graphe soit linéaire en pH.

# pH=p(H)
pS=p(S)

#%% GRAPHE
#print(H)
#print(pH)

# plt.xlim(0,14)
# plt.ylim(0,7)
plt.title("Evolution du cologarithme de la solubilité de Al(OH)3 en fonction du pH")
plt.xlabel("pH")
plt.ylabel("pS")

# plt.xscale('log')
# plt.yscale('log')
pS = [0 if a < 0 else a for a in pS]
#print(pS)
plt.plot(pH,pS)

plt.show()

#%% OPTIONNEL

#ax.grid(True) #Grille
#ax.legend(loc=2 ,prop={'size':20}) #Legende
